package xcache

import (
	"encoding/json"
	"fmt"
	"time"
)

// 设置Key的值
//
//	key	下标
//	val	值
//	t	延时删除时间
func SetExt(key, val string, t time.Duration) {
	SetGroup("", key, val, t)
}

// 设置key的值【按分组配置】
//
//	n	分组名
//	key	下标
//	val	值
//	t	延时删除时间
func SetGroup(n, key, val string, t time.Duration) {
	_default.Set(key, val, t)
	groupAdd(n, key)
}

// 设置Key的值
//
//	key	下标
//	val	值
func Set(key, val string) {
	SetExt(key, val, _default_cache_time)
}

// 设置数字类型缓存，避免使用时再进行fmt.Sprintf转化(因any类型可能为多种数字类型，所以此处使用fmt进行转化)
// 使用SetNumber存储，读取时也只能使用GetString进行读取，然后再通过xstring.Toxxxx进行转化【或者使用json.Number进行转化】
//
//	key	缓存下标
//	val	缓存值
func SetNumber(key string, val any) {
	switch v := val.(type) {
	case float32, float64:
		Set(key, fmt.Sprintf("%f", v))
	case int8, uint8, int16, uint16, int32, uint32, int, uint, int64, uint64:
		Set(key, fmt.Sprintf("%d", v))
	case string:
		Set(key, v)
	default:
		SetStruct(key, v)
	}
}

// 设置结构体
//
//	key	缓存的key名称
//	val	设置的缓存值类型，使用json串行化进行解析存储
func SetStruct(key string, val any) {
	SetStructGroup("", key, val)
}

// 设置结构体
//
//	g	缓存项分组名称
//	key	缓存的key名称
//	val	设置的缓存值类型，使用json串行化进行解析存储
func SetStructGroup(g, key string, val any) {
	str, err := json.Marshal(val)
	if err != nil {
		return
	}
	// 默认设置2小时缓存
	SetGroup(g, key, string(str), _default_cache_time)
}

// 设置结构体
//
//	key	缓存的key名称
//	val	设置的缓存值类型，使用json串行化进行解析存储
//	t	缓存时间
func SetStructExt(key string, val any, t time.Duration) {
	SetStructGroupExt("", key, val, t)
}

// 设置结构体
//
//	g	缓存项分组名称
//	key	缓存的key名称
//	val	设置的缓存值类型，使用json串行化进行解析存储
//	t	缓存时间
func SetStructGroupExt(g, key string, val any, t time.Duration) {
	str, err := json.Marshal(val)
	if err != nil {
		return
	}
	SetGroup(g, key, string(str), t)
}
